home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / serien / purity / nr.30 / forum / os2kursi.txt < prev    next >
Text File  |  1995-04-23  |  12KB  |  352 lines

  1.     ***********************************************************
  2.                    OS2.0 - Kurs
  3.  
  4.                   in KICK-Pascal
  5.  
  6.                by Björn Schotte (BOMBERSOFT)
  7.  
  8.     ***********************************************************
  9.  
  10.     Hi Freax !!
  11.  
  12.     Nachdem ich also vor nicht allzu langer Zeit Beispielproggys
  13.     zu OS2.0 vorstellte, melde ich mich nun mit einem echten (!!)
  14.     Kurs zur OS2.0-Programmierung zurück =;)
  15.  
  16.  
  17.     TEIL 1: Alles über Screens und Windows
  18.  
  19.     Vorwort: Das sicherlich neue an OS2.0 sind die sog. TagItems.
  20.     Diese sind wie folgt aufgebaut:
  21.  
  22.       TagItem = RECORD
  23.         ti_Tag  : LONG;
  24.         ta_Data : LONG;
  25.       END;
  26.  
  27.     Das Feld ti_Tag nimmt eine beliebige Konstante auf (z.B.
  28.     WA_InnerWidth etc.), ti_Data dagegen die "Daten", die ti_Tag
  29.     braucht.
  30.  
  31.     Also, als erstes wollen wir mal einen Screen öffnen. Die
  32.     Auflösung sollte in HIRES sein und als Breite bzw. Höhe
  33.     nehmen wir die Standardmaßen. Dann sieht ein Teil des Proggys
  34.     so aus:
  35.  
  36.        ta[1] := TagItem(SA_Width, STDSCREENWIDTH);
  37.        ta[2] := TagItem(SA_Height, STDSCREENHEIGHT);
  38.        ta[3] := TagItem(SA_DisplayID, HIRES_KEY);     { Auflösung }
  39.  
  40.     mit:
  41.  
  42.        ta : ARRAY[1..15] OF TagItem; { großzügig gewählt }
  43.  
  44.     Nun wollen wir noch einen Titel für unseren Screen und die Tiefe
  45.     setzen wir mal auf 2 (4 Farben):
  46.  
  47.      { Definiert man es so, kann man bei bestimmten Tags in
  48.        ti_Data einen String einsetzen !! }
  49.      ta[4].ti_Tag := SA_Title;
  50.      ta[4].ti_Data := "Erstes Beispiel-Programm zur OS2-Programmierung";
  51.      ta[5] := TagItem(SA_Depth, 2);
  52.  
  53.     So, nun wollen wir unseren Screen öffnen. Moment mal, wird hier
  54.     jemand sagen... Mußten wir nicht unter OS1.x die NewScreen-
  55.     Struktur vollkommen ausfüllen, und hier ??
  56.     Tja, der Vorteil von OS2.0 ist, daß ich nur die nötigsten Tags
  57.     ausfüllen muß bzw. kann, die anderen sind nämlich schon
  58.     vordefiniert !!! Also :
  59.  
  60.      { Die Tag-Liste müssen wir ja noch als "endlich" kennzeichnen: }
  61.      ta[6].ti_Tag := TAG_DONE; { oder TAG_END }
  62.  
  63.      sp := OpenScreenTagList(NIL, ^ta);
  64.      IF sp = NIL THEN { Fehler }
  65.  
  66.     Der erste Parameter ist ein Zeiger auf eine NewScreen-Struktur,
  67.     die dann mit den Tags ergänzt wird. Das brauchen wir aber nicht.
  68.     Nun haben wir unseren Screen geöffnet. Weitere Screen-Tags sind:
  69.  
  70.      SA_Left    Position des Screens links (Default: 0)
  71.      SA_Top    Position des Screens rechts (D: 0)
  72.      SA_DetailPen    Textfarbe des Titels (D: -1)
  73.      SA_BlockPen    Farbe des Titelbalkens (D: -1)
  74.      SA_Font    Standard Zeichensatz des Screens (D: System Def.Font)
  75.             { Zeiger auf eine TextAttr-Struktur erwartet:
  76.               z.B.: :=TagItem(SA_Font, LONG(^tattr)); }
  77.      SA_Type    CustomScreen oder WorkbenchScreen (D: CUSTOMSCREEN)
  78.             { CUSTOMSCREEN oder WBENCHSCREEN }
  79.      SA_BitMap    Zeiger auf eigene BitMap (D: NIL)
  80.      SA_ShowTitle    Darstellung der Titelzeile bei Backdrop-Windows
  81.             (D: LONG(FALSE) )
  82.      SA_Behind    Screen beim Öffnen nicht nach vorne bringen
  83.             (D: LONG(FALSE) )
  84.      SA_Quiet    Der Screen wird ohne Titelbalken und Gadgets
  85.             dargestellt (D: LONG(FALSE) )
  86.      SA_Overscan    Einen der definierten Overscan-Größen wählen:
  87.             OSCAN_TEXT, OSCAN_STANDARD, OSCAN_MAX oder
  88.             OSCAN_VIDEO   (D: OSCAN_TEXT)
  89.      SA_DClip    Angezeigter Aussschnitt des Screens
  90.             (DisplayClip-Region)  { Zeiger auf Rectangle }
  91.             (D: NIL)
  92.      SA_Autoscroll  Sollte der Screen größer sein, als man auf dem
  93.             Bildschirm darstellen kann, so wird mit diesem
  94.             Boolean-Tag festgelegt, ob das Betriebssystem
  95.             den Bildschirm verschieben soll, wenn man mit
  96.             dem Mauszeiger über den "Bildschirmrand" fährt.
  97.             (D: LONG(FALSE) )
  98.      SA_Pens    So, jetzt wird`s spannend: Diesen Tag sollte
  99.             man immer verwenden. Er legt nämlich fest, mit
  100.             welcher Farbe was gezeichnet wird (Gadget-Rand
  101.             hell/dunkel etc.). Man legt ein Array mit 9 bzw.
  102.             10 Elementen des Typs INTEGER an und legt dann
  103.             die Farben fest. Das letzte Element muß dann
  104.             auf -1 zeigen. Die Standardeinstellung     der
  105.             Workbench ist dabei:
  106.  
  107.             3,1,1,2,1,3,1,0,2, -1
  108.  
  109.             DETAILPEN,  BLOCKPEN,  TEXTPEN,  SHINEPEN,
  110.             SHADOWPEN,  FILLPEN,  FILLTEXTPEN,
  111.             BACKGROUNDPEN, HIGHLIGHTTEXTPEN
  112.  
  113.             Einfacher ist es, wenn man das erste Element
  114.             auf -1 läßt, dann werden die Einstellungen der
  115.             Workbench übernommen.    (D: nix)
  116.  
  117.      SA_PubName    Name des Screens als Public-Screens (D: NIL)
  118.      SA_PubTask    Dieser Task soll benachrichtigt werden, falls
  119.             das letzte Fenster auf dem PublicScreen
  120.             geschlossen worden ist. Nur gültig mit SA_PubSig
  121.             (D: aufrufender Task)
  122.      SA_PubSig    Signal, das per AllocSignal angefordert worden
  123.             ist.     (D: nix)
  124.      SA_ErrorCode    Zeiger auf eine Variable, in der im "Fehlerfall"
  125.             der Fehlercode abgelegt wird:
  126.  
  127.         OSERR_NOMONITOR      - angeforderter Monitor nicht vorh.
  128.         OSERR_NOCHIPS        - benötigte Customchips nicht vorh.
  129.         OSERR_NOCHIPMEM      - nicht genug CHIP-Memory
  130.         OSERR_NOMEM           - kein Speicher frei
  131.         OSERR_UNKNOWNMODE    - DisplayID unbekannt
  132.         OSERR_PUBNOTUNIQUE   - Name des PublicScreens existiert
  133.                        schon
  134.  
  135.     Es gibt noch ein paar mehr, die halte ich aber nicht für wichtig,
  136.     da sie eh selten gebraucht werden. Also, nun haben wir unseren
  137.     Screen geöffnet, jetzt muß nur noch ein Fenster her:
  138.  
  139.     Als erstes mal die Tags:
  140.  
  141.       WA_Left        Linke Position (0)
  142.       WA_Top        Obere Position (0)
  143.       WA_Width        Breite (ScreenWidth)
  144.       WA_InnerWidth     Breite des Fensters ohne Rahmen (zu bevorzugen)
  145.       WA_Height        Höhe (ScreenHeight)
  146.       WA_InnerHeight    Höhe des Fensters ohne Rahmen (zu bevorzugen)
  147.       WA_DetailPen        Textfarbe d. Titels (-1)
  148.       WA_BlockPen        Hintergrundfarbe d. Titels (-1)
  149.       WA_IDCMP        IDCMP-Flags des Fensters (0)
  150.       WA_Flags        Flags des Fensters (0)
  151.       WA_Gadgets        Zeiger auf Gadget-Liste, die ans Fenster
  152.                 angehängtwerden  { p_Gadget }   (D: NIL)
  153.       WA_CheckMark        p_Image : Zeiger auf ein Image, das den Haken
  154.                 für Menüitems definiert (D: NIL)
  155.       WA_Title        Unser Titel (D: nix)
  156.       WA_CustomScreen   Übergeben wird hier unser Screen (nix)
  157.       WA_SuperBitMap    Zeiger auf SuperBitMap { p_BitMap } (nix)
  158.       WA_MinWidth        Minimale Breite (D: WA_Width)
  159.       WA_MaxWidth        Maximale Breite (D: WA_Width)
  160.       WA_MinHeight        Minimale Höhe (D: WA_Height)
  161.       WA_MaxHeight        Maximale Höhe (D: WA_Height)
  162.       WA_ScreenTitle    ScreenTitle bei aktivem Fenster
  163.       WA_AutoAdjust     (LONG(TRUE) oder LONG(FALSE) ) -> Anpassung
  164.                 der Fenstergröße an den Screen erlaubt
  165.       WA_PubScreenName  Name des PublicScreens, auf dem das Fenster
  166.                  erscheinen soll
  167.       WA_PubScreen        Zeiger auf PublicScreen, auf dem das Fenster
  168.                 erscheinen soll (muß mit LockPubScreen
  169.                 gesichert werden !!)
  170.       WA_MouseQueue     maximale Anzahl der IDCMP_MOUSEMOVE-Messages,
  171.                 die von Intuition aneinandergereiht werden
  172.                 (D: 5)
  173.  
  174.     Also, öffnen wir ein Fenster:
  175.  
  176.       ta[1] := TagItem(WA_IDCMP, IDCMP_CLOSEWINDOW);
  177.       ta[2] := TagItem(WA_Flags, WFLG_CLOSEGADGET+WFLG_ACTIVATE);
  178.       ta[3] := TagItem(WA_CustomScreen, LONG(sp));
  179.       ta[4].ti_Tag := WA_Title;
  180.       ta[4].ti_Data := "Hallo";
  181.       ta[5] := TagItem(WA_Top, 14);
  182.       ta[6] := TagItem(WA_Height, sp^.Height - 14);
  183.       ta[7].ti_Tag := TAG_DONE;
  184.  
  185.       wp := OpenWindowTagList(NIL,^ta);
  186.       IF wp = NIL THEN { Fehler }
  187.  
  188.     mit:
  189.       wp : p_Window;
  190.       sp : p_Screen;
  191.  
  192.     Nun warten wir wie üblich mit WaitPort() und GetMsg() und
  193.     replyen das ganze dann mit ReplyMsg() und schliessen dann
  194.     wie folgt:
  195.  
  196.       CloseWindow(wp);
  197.       ok := CloseScreen(sp);
  198.       { TRUE, falls Screen geschlossen werden konnte, andernfalls
  199.         FALSE (Fenster noch auf dem Screen !!) }
  200.  
  201.     mit:
  202.       ok : BOOLEAN;
  203.  
  204.     OK. Auf zum nächsten...
  205.  
  206.  
  207.  
  208.     TEIL 2: DIE GADTOOLS.LIBRARY
  209.  
  210.     Nun haben wir schon Screens und Fenster geöffnet, aber das
  211.     alleine sieht noch nicht gut aus. Jetzt wollen wir Gadgets
  212.     und Menüs in unserem Fenster installieren:
  213.  
  214.     Also, als erstes brauchen wir die sog. VisualInfo.
  215.     VisualInfo ?? Richtig gehört: Sie braucht man zum Screen-
  216.     spezifischen Zeichnen von Gadgets und Menüs. Und wie bekommen
  217.     wir die ?? Ganz einfach, mit der Funktion GetVisualInfoA() aus
  218.     der GadTools.library:
  219.  
  220.       { Am Anfang des Proggys: }
  221.       OpenLib(gadtoolsbase,"gadtools.library",36);
  222.  
  223.       vi := GetVisualInfoA(ps, NIL);
  224.  
  225.     mit:
  226.  
  227.       vi : PTR;
  228.       ps : p_Screen;
  229.  
  230.     Doch von welchem Screen brauchen wir die ? Vorausgesetzt,
  231.     daß wir unser Fenster auf einem eigenen Screen öffnen, setzen
  232.     wir unseren Screen-Pointer ein. Sollte unser Fenster auf der
  233.     Workbench geöffnet werden, so müssen wir den Workbench-Screen-
  234.     Zeiger einsetzen. Wie das geht ? Ganz einfach:
  235.  
  236.       ps := LockPubScreen("Workbench"); { Anstatt "Wor..." auch NIL }
  237.       IF ps = NIL THEN { Fehler }
  238.  
  239.     LockPubScreen ?? Tja, diese Funktion ist ähnlich der von LockIBase.
  240.     Doch hier wird der Public (öffentliche) Screen gesperrt, so daß
  241.     keine Fenster etc. geöffnet werden können bzw. der Screen
  242.     geschlossen werden kann, um somit einige Daten zu bekommen. Wie
  243.     bei LockIBase müssen wir, wenn wir unsere VisualInfo haben, den
  244.     PubScreen wieder entriegeln. Somit sieht das eigentliche Fragment
  245.     so aus:
  246.  
  247.       { Weiter oben Screen öffnen, falls gewünscht }
  248.  
  249.       ps := LockPubScreen(NIL);
  250.       IF ps = NIL THEN { Fehler }
  251.       vi := GetVisualInfoA(ps, NIL);
  252.       UnLockPubScreen(NIL, ps);
  253.       IF vi = NIL THEN { Fehler }
  254.  
  255.     So, sollte alles gut laufen, haben wir jetzt unsere VisualInfo.
  256.     Nun wollen wir Gadgets in unser Fenster einbauen. Wie unter OS1.x
  257.     möglich, kann man entscheiden, ob man direkt beim Öffnen die
  258.     Gadgets in die Window-Gadget-List einhängt (WA_Gadgets !!) oder
  259.     erst später per AddGList/AddGadget...  Ich ziehe den ersteren
  260.     Fall vor, allerdings müssen wir dann hier erst die Gadgets
  261.     definieren und dann (!) das Fenster öffnen. Wir verwenden aber
  262.     zum "Bauen" keine Gadget-Struktur, sondern definieren uns die
  263.     NewGadget-Struktur, die man so definiert:
  264.  
  265.       ng := NewGadget(10,20,              { LeftEdge, TopEdge }
  266.               200,13,          { Breite, Höhe }
  267.               "Hallo",^tattr,     { GadgetText, TextAttr }
  268.               1,PLACETEXT_IN,     { GadgetNumber, Flags }
  269.               vi,NIL);          { VisualInfo, UserData }
  270.  
  271.     Einige Elemente sind sicher schon bekannt (Gadget-Struktur !!).
  272.     Also, was wir brauchen, ist die VisualInfo (die holen wir uns
  273.     vom PubScreen) und evtl. eine TextAttr-Struktur. Beispiel: Wir
  274.     definieren uns ein Gadget, dann sieht unser Programmfragment
  275.     so aus:
  276.  
  277.       gl := NIL;
  278.       gad := CreateContext(^gl);   { MEGA-WICHTIG !! }
  279.       IF gad=NIL THEN { Fehler }
  280.  
  281.       ng := NewGadget(10,20,
  282.               100,13,
  283.               "_Start",^tattr,    { "_" ?? siehe unten }
  284.               1,PLACETEXT_IN,
  285.               vi,NIL);
  286.  
  287.       { "_" ?? : }
  288.       t[1] := TagItem(GT_Underscore, LONG("_"));
  289.       { Aha, hier definieren wir das "Erkennungszeichen", welcher
  290.         Buchstabe unterstrichen werden soll (in unserem Beispiel
  291.         "S") }
  292.  
  293.       gad1 := CreateGadgetA(BUTTON_KIND,gad,^ng,^t);
  294.  
  295.       { CreateGadgetA(Art_des_Gadgets,Vorgänger_Gadget,
  296.               Zeiger_auf_Record,Evtl_Tags); }
  297.  
  298.       IF gad1 = NIL THEN { Fehler }
  299.  
  300.       { Fenster öffnen; Tag WA_Gadgets:
  301.  
  302.         t[x] := TagItem(WA_Gadgets, LONG(gl));   }
  303.  
  304.     Alles klar ??
  305.  
  306.     Es gibt noch viele weitere Gadgets als nur Button-Gadgets:
  307.  
  308.     Stringgadget:
  309.  
  310.        Wie unter OS1.x ein Gadget, in dem man etwas eingeben kann.
  311.  
  312.     Integergadget:
  313.  
  314.        Hier kann man nur Zahlen eingeben. Ausgelesen wird dies über
  315.        die StringInfo des Gadgets !!
  316.  
  317.     CheckBox:
  318.  
  319.        Die Dinger mit dem Haken.
  320.  
  321.     RadioButton:
  322.  
  323.        Kleine quadratische Felder, ähnlich CheckBox, nur daß hier
  324.        bei aktiviertem Zustand der Inhalt ausgefüllt wird.
  325.  
  326.  
  327.     Tja, es gibt noch einige mehr, aber es ist jetzt 21:01, und ich
  328.     will mich jetzt mal ranmachen und SeaQuest gucken, außerdem muß
  329.     die Disk jetzt endgültig an Diesel ....
  330.  
  331.     Ich hoffe, ich habe nichts falsches geschrieben. Sollte irgend
  332.     jemand Fehler entdecken oder noch weitere Vorschläge haben, dann
  333.     soll er mir schreiben:
  334.  
  335.       Björn Schotte
  336.       Am Burkardstuhl 45
  337.       97267 Himmelstadt
  338.  
  339.     P.S.: Freut Euch, FreaX, bald gibt es den 2. Teil der OS2.x-
  340.     Programmierung, u.a. mit der Fortsetzung der GadTools-Library,
  341.     ASL-Library und abschliessende Tips...
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.